package com.ctg.itrdc.imageconsole.util;

import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;



/**
 * 
 * @Description 定时任务工具类
 * @author wupiao
 * @since 2017年2月16日
 */
@SuppressWarnings("rawtypes")
public class QuartzUtils {
	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
	private static String JOB_GROUP_NAME = "AUTO_ELASTIC_JOBGROUP";
	private static String TRIGGER_GROUP_NAME = "AUTO_ELASTIC_TRIGGERGROUP";

	/**
	 * 添加一个定时任务(使用默认的任务组名，触发器名，触发器组名)
	 *  
	 * @param jobName 任务名称
	 * @param jobDataMap 执行任务时用到的数据
	 * @param cls 执行任务的类
	 * @param cron 时间设置，cron表达式,例如 "0 15 10 15 * ?" 表示：每月15日上午10:15触发 
	 * @param startTime 开始执行定时任务的时间
	 * @return void
	 * @author wupiao
	 * @since 2017年2月21日
	 */
	public static void addJob(String jobName, JobDataMap jobDataMap, Class cls, String cron, Date startTime) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);
			jobDetail.setJobDataMap(jobDataMap);
			// 触发器
			CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);
			trigger.setCronExpression(cron);
			if (startTime != null) {
				trigger.setStartTime(startTime);
			}
			sched.scheduleJob(jobDetail, trigger);
			// 启动
			if (!sched.isShutdown()) {
				sched.start();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 
	 * @Description 添加一个定时任务
	 * @param jobName
	 *            任务名
	 * @param jobDataMap
	 *            执行任务的一些数据
	 * @param jobGroupName
	 *            任务组名
	 * @param triggerName
	 *            触发器名
	 * @param triggerGroupName
	 *            触发器组名
	 * @param jobClass
	 *            执行任务的类
	 * @param time
	 *            cron表达式
	 * @param startTime
	 *            开始执行定时任务的时间
	 * @author wupiao
	 * @since 2017年2月16日
	 */
	public static void addJob(String jobName, JobDataMap jobDataMap, String jobGroupName, String triggerName,
			String triggerGroupName, Class jobClass, String time, Date startTime) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);
			jobDetail.setJobDataMap(jobDataMap);
			// 触发器
			CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);
			trigger.setCronExpression(time);
			if (startTime != null) {
				trigger.setStartTime(startTime);
			}
			sched.scheduleJob(jobDetail, trigger);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 修改一个定时任务(使用默认的任务组名，触发器名，触发器组名)
	 *  
	 * @param jobName
	 * @param jobDataMap 执行任务时用到的数据,若为null,则用之前的
	 * @param cron 时间设置，cron表达式,例如 "0 15 10 15 * ?" 表示：每月15日上午10:15触发 
	 * @param startTime 开始执行任务的时间
	 * @return void
	 * @author wupiao
	 * @since 2017年2月21日
	 */
	public static void modifyJobTime(String jobName, JobDataMap jobDataMap, String cron, Date startTime) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME);
			if (trigger == null) {
				return;
			}
			JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME);
			if (jobDataMap == null) {
				jobDataMap = jobDetail.getJobDataMap();
			}
			Class objJobClass = jobDetail.getJobClass();
			removeJob(jobName);
			addJob(jobName, jobDataMap, objJobClass, cron, startTime);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	

	/**
	 * 
	 * @Description 移除一个任务(使用默认的任务组名，触发器名，触发器组名)
	 * @param jobName
	 *            任务名称 void
	 * @author wupiao
	 * @since 2017年2月16日
	 */
	public static void removeJob(String jobName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			// 停止触发器
			sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);
			// 移除触发器
			sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);
			// 删除任务
			sched.deleteJob(jobName, JOB_GROUP_NAME);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	
	public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			// 停止触发器
			sched.pauseTrigger(triggerName, triggerGroupName);
			// 移除触发器
			sched.unscheduleJob(triggerName, triggerGroupName);
			// 删除任务
			sched.deleteJob(jobName, jobGroupName);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 
	 * @Description 判断一个定时任务是否存在
	 * @param jobName
	 *            任务名称 
	 * @return boolean true表示存在，false表示不存在
	 * @author wupiao
	 * @since 2017年2月16日
	 */
	public static boolean isJobExist(String jobName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME);
			if (trigger == null) {
				return false;
			}
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	

	// 启动所有定时任务
	public static void startJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			sched.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	// 关闭所有定时任务
	public static void shutdownJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			if (!sched.isShutdown()) {
				sched.shutdown();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
/*
	public static void main(String[] args) {
		try {
			JobDataMap jobDataMap = new JobDataMap();
			jobDataMap.put("rcName", "test111");
			System.out.println("【系统启动】开始(每2秒输出一次)...");
			QuartzUtils.addJob("动态任务调度1", jobDataMap, AutoElasticServiceImpl.class, "10/2 * * * * ?", null);

			Thread.sleep(6000);
			// System.out.println("【移除定时】开始...");
			// QuartzUtils.removeJob(job_name);
			// System.out.println("【移除定时】成功");

			System.out.println("【再次添加定时任务】开始(每5秒输出一次)...");
			jobDataMap.put("rcName", "test222");
			QuartzUtils.addJob("动态任务调度2", jobDataMap, AutoElasticServiceImpl.class, "5 * * * * ?", null);
			// Thread.sleep(30000);
			// System.out.println("【移除定时】开始...");
			// QuartzUtils.removeJob(job_name);
			// System.out.println("【移除定时】成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	*/
}
